package interview.singleton;

/**
 * 4. 兼顾线程安全和效率的写法
 * <p>
 * 虽然上面这种写法是可以正确运行的，但是其效率低下，还是无法实际应用。
 * 因为每次调用getSingleton()方法，都必须在synchronized这里进行排队，
 * 而真正遇到需要new的情况是非常少的。所以，就诞生了第三种写法：
 */
public class Singleton4 {

    private static volatile Singleton4 singleton = null;

    private Singleton4() {
    }

    public static Singleton4 getSingleton() {
        if (singleton == null) {
            synchronized (Singleton4.class) {
                if (singleton == null) {
                    singleton = new Singleton4();
                }
            }
        }
        return singleton;
    }
}